#include <iostream>
#include <sys/ipc.h>    // Inter-Process Communication
#include <sys/shm.h>
#include <cstring>
#include <unistd.h>
#include "comm.hpp"

int main()
{
    key_t key = GetKey();
    std::cout << "key: " << ToHex(key) << std::endl;

    // key vs shmid
    // key: 不要在应用层使用，只用来在内核中标识shm的唯一性！
    // shmid: 应用这个共享内存的时候，我们使用shmid来操作共享内存。
    std::cout << "开劈共享内存" << std::endl;
    int shmid = shmget(key, size, IPC_CREAT|IPC_EXCL|0644);
    if (shmid < 0)
    {
        std::cerr << "errno: " << errno << ", errstring: " << strerror(errno) << std::endl;
        return 1;
    }
    std::cout << "shmid: " << shmid << std::endl;
    sleep(5);

    // 挂接
    std::cout << "开始将shm映射到进程的地址空间中" << std::endl;
    char *s = (char*)shmat(shmid, nullptr, 0);
    sleep(5);

    // 去关联
    shmdt(s);
    std::cout << "将shm从进程地址空间中移除" << std::endl;
    sleep(5);

    // 删除共享内存
    shmctl(shmid, IPC_RMID, nullptr);
    std::cout << "将shm从OS中删除" << std::endl;
    sleep(5);

    return 0;
}